package com.study.行为型模式.解释器模式;

import java.util.HashMap;
import java.util.Stack;

public class Calculator {

    //定义表达式
    private Expression expression;

    //构造函数传参，并解析
    public Calculator(String expStr){
        //安排运算先后顺序 ,使用stack
        Stack<Expression> stack = new Stack<>();
        //表达式拆分成字符数组
        char[] chars = expStr.toCharArray();

        Expression left = null;
        Expression right = null;
        //遍历字符数组，针对不同情况，做处理
        for (int i = 0; i < chars.length; i++) {
            switch (chars[i]){
                case '+':
                    left = stack.pop();
                    right = new VarExpression(String.valueOf(chars[++i]));
                    stack.push(new AddExpression(left,right));
                    break;
                case '-':
                    left = stack.pop();
                    right=new VarExpression(String.valueOf(chars[++i]));
                    stack.push(new SubExpression(left,right));
                    break;
                default:
                    //如果是一个var 就创建一个VarExpression对象，并push到stack中
                    stack.push(new VarExpression(String.valueOf(chars[i])));
                    break;
            }
        }
        //当遍历完整个数组后，stack中就得到了最后的expression。这个expression内部是各种嵌套的
        this.expression = stack.pop();
    }

    public int run(HashMap<String,Integer> var){
        //最后将表达式和var绑定
        return this.expression.interpret(var);
    }
}
